package com.bbva.kyfb.firmas.controller;

import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.bbva.jee.arq.spring.core.contexto.ArqSpringContext;
import com.bbva.kyfb.firmas.beans.ErrorInfo;
import com.bbva.kyfb.firmas.json.FirmaResponseJSON;
import com.bbva.kyfb.firmas.json.ListaFicheros;
import com.bbva.kyfb.firmas.json.RespuestaJSON;
import com.bbva.kyfb.firmas.servicios.ServicioFicheroConfeccionV01;
import com.bbva.kyfb.firmas.servicios.ServicioFicherosConfeccionV01Impl;
import com.bbva.kyfb.firmas.servicios.ServicioFirmasV01;
import com.bbva.kyfb.firmas.servicios.ServicioFirmasV01Impl;
import com.bbva.kyfb.firmas.servicios.ServicioHistoricoV01;
import com.bbva.kyfb.firmas.servicios.ServicioHistoricoV01Impl;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.ComponentsForSignRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.DeletedFilesResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoComponentDetail;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoComponentRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFile;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAuditRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAuditResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileDetailedRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileFir;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileFirResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoToDeleteRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoToDeleteRequestMaking;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.SignedComponentsResponse;

@Controller
public class FirmasConfeccionMockController {
	
	ServicioFirmasV01 servicioFirmas = new ServicioFirmasV01Impl();
	ServicioFicheroConfeccionV01 servicioFicheroConfeccion = new ServicioFicherosConfeccionV01Impl();
	ServicioHistoricoV01 servicioHistorico = new ServicioHistoricoV01Impl();
	FirmasConfeccionMockUtilities utilidades = new FirmasConfeccionMockUtilities();
	
	@RequestMapping(value="/listarFirmasConfeccionMock", method=RequestMethod.POST)
	public @ResponseBody List<FirmaResponseJSON> listarFirmas(){
		List<FirmaResponseJSON> firmas = new ArrayList<FirmaResponseJSON>();
		firmas.add(new FirmaResponseJSON("Confirming", "Pago de nóminas (BEIC204PRUEB_ESP_123456.NOM)", "ALIAS", "03/05/2013","04/05/2013", "1", "1,000,000,00 (USD)", "Confección"));
		return firmas;
	}
	@RequestMapping(value="/descargarFichero", method= { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody List<FirmaResponseJSON> descargarFichero(){
		return null;
	}
	@RequestMapping(value="/verDetalleFichero", method= { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody RespuestaJSON verDetalleFichero(@RequestParam("sIdOrdenFirmas") String sIdOrdenFirmas,
			@RequestParam("sCodTipoOrden") String sCodTipoOrden,
			@RequestParam("sCodOrigen") String sCodOrigen,
			@RequestParam("sMostrarOrdenes") String sMostrarOrdenes,
			@RequestParam("sIdioma") String sIdioma){
		RespuestaJSON respuesta = new RespuestaJSON();
		ErrorInfo errorInfo = new ErrorInfo();
		InfoComponentDetail data = new InfoComponentDetail();
		
		InfoComponentRequest infoComponentRequest = utilidades.obtenerInfoComponentRequest(sIdOrdenFirmas, 
				sCodTipoOrden, sCodOrigen, sMostrarOrdenes, sIdioma, errorInfo);
		
		data = servicioFirmas.getDetalleComponente(infoComponentRequest);
		
		respuesta.setSuccess(RespuestaJSON.SUCCESS_OK);
		respuesta.setData(data);
		respuesta.setErrorInfo(errorInfo);
		
		return respuesta;
	}
	@RequestMapping(value="/buscarFichero", method= { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody List<FirmaResponseJSON> buscarFichero(){
		return null;
	}
	@RequestMapping(value="/cambiarUsuarioFirmante", method= { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody List<FirmaResponseJSON> cambiarUsuarioFirmante(){
		return null;
	}
	@RequestMapping(value="/firmarFichero", method= { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody RespuestaJSON firmarFichero(@RequestParam("sTipoFirma") String sTipoFirma,
			@RequestParam("sCodOrigen") String sCodOrigen,
			@RequestParam("sCanal") String sCanal,
			@RequestParam("sBancoInt") String sBancoInt,
			@RequestParam("sReferencia") String sReferencia,
			@RequestParam("sCodUsuario") String sCodUsuario,
			@RequestParam("sCodUsuarioFirma") String sCodUsuarioFirma,
			@RequestParam("sNIFUsuario") String sNIFUsuario,
			@RequestParam("sPasswordUsuario") String sPasswordUsuario,
			@RequestParam("sPasswordFisico") String sPasswordFisico,
			@RequestParam("sTokenFisico") String sTokenFisico,
			@RequestParam("sPoderFirma") String sPoderFirma,
			@RequestParam("sTipoValidacion") String sTipoValidacion,
			@RequestParam("listaFirmar") String[][] listaFirmar){
		RespuestaJSON respuesta = new RespuestaJSON();
		ErrorInfo errorInfo = new ErrorInfo();
		SignedComponentsResponse signedComponentsResponse = new SignedComponentsResponse();
		
		ComponentsForSignRequest componentsForSignRequest = utilidades.obtenerComponentsForSignRequest(sTipoFirma, sCodOrigen, sCanal, sBancoInt, 
				sReferencia, sCodUsuario, sCodUsuarioFirma, sNIFUsuario, sPasswordUsuario, sPasswordFisico, sTokenFisico, 
				sPoderFirma, sTipoValidacion, listaFirmar, errorInfo);
		
		signedComponentsResponse = servicioFirmas.putFirmaComponente(componentsForSignRequest);
		
		respuesta.setSuccess(RespuestaJSON.SUCCESS_OK);
		respuesta.setData(signedComponentsResponse);
		respuesta.setErrorInfo(errorInfo);
		
		return respuesta;
	}
	/**
	 * Consulta la auditoria del fichero
	 * @param sIdOrdenFirmas
	 * @param sCanal
	 * @param sBancoInt
	 * @param sReferencia
	 * @param sTipoOrden
	 * @param iOrigenAuditoria 0: Confección 1: Pendiente 2: Histórico
	 * @return
	 */
	@RequestMapping(value="/consultarAuditoriaFichero", method= { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody RespuestaJSON consultarAuditoriaFichero(@RequestParam("sIdOrdenFirmas") String sIdOrdenFirmas,
			@RequestParam("sCanal") String sCanal,
			@RequestParam("sBancoInt") String sBancoInt,
			@RequestParam("sReferencia") String sReferencia,
			@RequestParam("sTipoOrden") String sTipoOrden,
			@RequestParam("iOrigenAuditoria") int iOrigenAuditoria){
		RespuestaJSON respuesta = new RespuestaJSON();
		ErrorInfo errorInfo = new ErrorInfo();
		InfoFileAuditResponse infoFileAuditResponse = new InfoFileAuditResponse();
		
		InfoFileAuditRequest infoFileAuditRequest = utilidades.obtenerInfoFileAuditRequest(sIdOrdenFirmas, sCanal, sBancoInt, sReferencia, sTipoOrden, errorInfo);
		infoFileAuditResponse = obtenerInfoFileAuditResponse(infoFileAuditRequest, iOrigenAuditoria, errorInfo);
		
		respuesta.setSuccess(RespuestaJSON.SUCCESS_OK);
		respuesta.setData(infoFileAuditResponse);
		respuesta.setErrorInfo(errorInfo);
		
		return respuesta;
	}
	/**
	 * Elimina los ficheros pendientes
	 * @param sTipoFirma
	 * @param sCodOrigen
	 * @param sCanal
	 * @param sBancoInt
	 * @param sReferencia
	 * @param sCodUsuario
	 * @param sCodUsuarioFirma
	 * @param sNIFUsuario
	 * @param sPasswordUsuario
	 * @param sPasswordFisico
	 * @param sTokenFisico
	 * @param sPoderFirma
	 * @param sTipoValidacion
	 * @param listaEliminar
	 * @return
	 */
	@RequestMapping(value="/eliminarFicheroPendiente", method= { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody RespuestaJSON eliminarFicheroPendiente(@RequestParam("sTipoFirma") String sTipoFirma,
			@RequestParam("sCodOrigen") String sCodOrigen,
			@RequestParam("sCanal") String sCanal,
			@RequestParam("sBancoInt") String sBancoInt,
			@RequestParam("sReferencia") String sReferencia,
			@RequestParam("sCodUsuario") String sCodUsuario,
			@RequestParam("sCodUsuarioFirma") String sCodUsuarioFirma,
			@RequestParam("sNIFUsuario") String sNIFUsuario,
			@RequestParam("sPasswordUsuario") String sPasswordUsuario,
			@RequestParam("sPasswordFisico") String sPasswordFisico,
			@RequestParam("sTokenFisico") String sTokenFisico,
			@RequestParam("sPoderFirma") String sPoderFirma,
			@RequestParam("sTipoValidacion") String sTipoValidacion,
			@RequestParam("listaEliminar") String[][] listaEliminar){
		
		// Definición e inicialización de las variables
		RespuestaJSON respuesta = new RespuestaJSON();
		ErrorInfo errorInfo = new ErrorInfo();
		DeletedFilesResponse deletedFilesResponse = new DeletedFilesResponse();
		
		// Construcción de la request
		InfoToDeleteRequest infoToDeleteRequest = utilidades.obtenerInfoToDeleteRequest(sTipoFirma, sCodOrigen, sCanal, sBancoInt, 
				sReferencia, sCodUsuario, sCodUsuarioFirma, sNIFUsuario, sPasswordUsuario, sPasswordFisico, sTokenFisico, 
				sPoderFirma, sTipoValidacion, listaEliminar, errorInfo);
		
		// Obtención del deletedFilesResponse
		deletedFilesResponse = servicioFirmas.deleteComponentePendiente(infoToDeleteRequest);
		
		respuesta.setSuccess(RespuestaJSON.SUCCESS_OK);
		respuesta.setErrorInfo(errorInfo);
		respuesta.setData(deletedFilesResponse.getInfoDeletedFiles());
		
		return respuesta;
	}
	/**
	 * Elimina los ficheros en confección
	 * @param sCanal
	 * @param sBancoInt
	 * @param sReferencia
	 * @param sCodUsuario
	 * @param listaEliminar
	 * @return
	 */
	@RequestMapping(value="/eliminarFicheroEnConfeccion", method= { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody RespuestaJSON eliminarFicheroEnConfeccion(@RequestParam("sCanal") String sCanal,
			@RequestParam("sBancoInt") String sBancoInt,
			@RequestParam("sReferencia") String sReferencia,
			@RequestParam("sCodUsuario") String sCodUsuario,
			@RequestParam("listaEliminar") String[][] listaEliminar){
		
		// Definición e inicialización de las variables
		RespuestaJSON respuesta = new RespuestaJSON();
		ErrorInfo errorInfo = new ErrorInfo();
		DeletedFilesResponse deletedFilesResponse = new DeletedFilesResponse();
		
		// Construcción de la request
		InfoToDeleteRequestMaking infoToDeleteRequestMaking = utilidades.obtenerInfoToDeleteRequestMaking(sCanal, sBancoInt, sReferencia, sCodUsuario, listaEliminar, errorInfo);
		
		// Obtención del deletedFilesResponse
		deletedFilesResponse = servicioFicheroConfeccion.deleteComponenteConfeccion(infoToDeleteRequestMaking);
		
		respuesta.setSuccess(RespuestaJSON.SUCCESS_OK);
		respuesta.setErrorInfo(errorInfo);
		respuesta.setData(deletedFilesResponse.getInfoDeletedFiles());
		
		return respuesta;
	}
	/**
	 * Lista los ficheros en confección
	 * @param sCanal
	 * @param sBancoInt
	 * @param sReferencia
	 * @param sCodOrigen
	 * @param sTipoFirma
	 * @param sPaginacionDesde
	 * @param sPaginacionNumElementos
	 * @param sTipoOrden
	 * @param sCodEstado
	 * @param sDivisa
	 * @param sTipoFecha
	 * @param sFechaDesde
	 * @param sFechaHasta
	 * @param sImporteDeste
	 * @param sImporteHasta
	 * @param sUsuarioOrdenante
	 * @return
	 */
	@RequestMapping(value="/listarFicherosEnConfeccion", method = { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody RespuestaJSON listarFicherosEnConfeccion(
			@RequestParam("sCanal") String sCanal,
			@RequestParam("sBancoInt") String sBancoInt,
			@RequestParam("sReferencia") String sReferencia,
			@RequestParam("sCodOrigen") String sCodOrigen,
			@RequestParam("sTipoFirma") String sTipoFirma,
			@RequestParam("sPaginacionDesde") int sPaginacionDesde,
			@RequestParam("sPaginacionNumElementos") int sPaginacionNumElementos,
			@RequestParam(value="sTipoOrden", required = false, defaultValue = "") String sTipoOrden,
			@RequestParam(value="sCodEstado", required = false, defaultValue = "") String sCodEstado,
			@RequestParam(value="sDivisa", required = false, defaultValue = "") String sDivisa,
			@RequestParam(value="sTipoFecha", required = false, defaultValue = "") String sTipoFecha,
			@RequestParam(value="sFechaDesde", required = false, defaultValue = "") String sFechaDesde,
			@RequestParam(value="sFechaHasta", required = false, defaultValue = "") String sFechaHasta,
			@RequestParam(value="sImporteDeste", required = false, defaultValue = "") String sImporteDeste,
			@RequestParam(value="sImporteHasta", required = false, defaultValue = "") String sImporteHasta,
			@RequestParam(value="sUsuarioOrdenante", required = false, defaultValue = "") String sUsuarioOrdenante){
		
		// Definición e inicialización de las variables
		RespuestaJSON respuesta = new RespuestaJSON();
		ErrorInfo errorInfo = new ErrorInfo();
		ListaFicheros data = new ListaFicheros();
		InfoFileResponse infoFileResponse = new InfoFileResponse();
		List<FirmaResponseJSON> listaFicheros = new ArrayList<FirmaResponseJSON>();
		int totalEnConfeccion = 0;
		int totalPendienteFirma = 0;
		int totalHistorico = 0;
		
		// Construcción de la request
		InfoFileRequest infoFileRequest = utilidades.obtenerInfoFileRequest(sCanal, sBancoInt, sReferencia, sCodOrigen, sTipoFirma, sPaginacionDesde,
				sPaginacionNumElementos, sTipoOrden, sCodEstado, sDivisa, sTipoFecha, sFechaDesde, sFechaHasta, sImporteDeste,
				sImporteHasta, sUsuarioOrdenante, errorInfo);
				
		// Obtención del infoFileResponse
		infoFileResponse = servicioFicheroConfeccion.getComponentesConfeccionReferencia(infoFileRequest);
		
		// Manejo del infoFileResponse para mostrar la información
		if(infoFileResponse.getCodError() == null){
			listaFicheros = null;
			respuesta.setSuccess(RespuestaJSON.SUCCESS_KO);
		}else{
			listaFicheros = listaFicheros(infoFileResponse);
			// Obtención del total de ficheros en confeccion
			totalEnConfeccion = infoFileResponse.getTotalComponentes();
			respuesta.setSuccess(RespuestaJSON.SUCCESS_OK);
		}
		
		// Obtención del total de ficheros pendientes de firma
		totalPendienteFirma = totalFicherosPendiente(sCanal, sBancoInt, sReferencia, sCodOrigen, sTipoFirma);
		// Obtención del total de ficheros en histórico
		totalHistorico = totalFicherosHistorico(sCanal, sBancoInt, sReferencia, sCodOrigen, sTipoFirma);
		
		// Establecimiento de las variables en el objeto data
		data.setListaFicheros(listaFicheros);
		data.setTotalEnConfeccion(totalEnConfeccion);
		data.setTotalPendienteFirma(totalPendienteFirma);
		data.setTotalHistorico(totalHistorico);
		
		// Establecimiento de los valores en la respuesta
		respuesta.setData(data);
		respuesta.setErrorInfo(errorInfo);
		
		return respuesta;
	}
	/**
	 * Lista los ficheros pendientes de firma
	 * @param sCanal
	 * @param sBancoInt
	 * @param sReferencia
	 * @param sCodOrigen
	 * @param sTipoFirma
	 * @param sPaginacionDesde
	 * @param sPaginacionNumElementos
	 * @param sTipoOrden
	 * @param sCodEstado
	 * @param sDivisa
	 * @param sTipoFecha
	 * @param sFechaDesde
	 * @param sFechaHasta
	 * @param sImporteDeste
	 * @param sImporteHasta
	 * @param sUsuarioOrdenante
	 * @return
	 */
	@RequestMapping(value="/listarFicherosPendienteFirma", method= { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody RespuestaJSON listarFicherosPendienteFirma(
			@RequestParam("sCanal") String sCanal,
			@RequestParam("sBancoInt") String sBancoInt,
			@RequestParam("sReferencia") String sReferencia,
			@RequestParam("sCodOrigen") String sCodOrigen,
			@RequestParam("sTipoFirma") String sTipoFirma,
			@RequestParam("sPaginacionDesde") int sPaginacionDesde,
			@RequestParam("sPaginacionNumElementos") int sPaginacionNumElementos,
			@RequestParam(value="sTipoOrden", required = false, defaultValue = "") String sTipoOrden,
			@RequestParam(value="sCodEstado", required = false, defaultValue = "") String sCodEstado,
			@RequestParam(value="sDivisa", required = false, defaultValue = "") String sDivisa,
			@RequestParam(value="sTipoFecha", required = false, defaultValue = "") String sTipoFecha,
			@RequestParam(value="sFechaDesde", required = false, defaultValue = "") String sFechaDesde,
			@RequestParam(value="sFechaHasta", required = false, defaultValue = "") String sFechaHasta,
			@RequestParam(value="sImporteDeste", required = false, defaultValue = "") String sImporteDeste,
			@RequestParam(value="sImporteHasta", required = false, defaultValue = "") String sImporteHasta,
			@RequestParam(value="sUsuarioOrdenante", required = false, defaultValue = "") String sUsuarioOrdenante){
		
		// Variables a incluir en la respuesta
		RespuestaJSON respuesta = new RespuestaJSON();
		ErrorInfo errorInfo = new ErrorInfo();
		ListaFicheros data = new ListaFicheros();
		InfoFileFirResponse infoFileFirResponse = new InfoFileFirResponse();
		List<FirmaResponseJSON> listaFicheros = new ArrayList<FirmaResponseJSON>();
		int totalEnConfeccion = 0;
		int totalPendienteFirma = 0;
		int totalHistorico = 0;
		
		// Construcción de la request
		InfoFileRequest infoFileRequest = utilidades.obtenerInfoFileRequest(sCanal, sBancoInt, sReferencia, sCodOrigen, sTipoFirma, sPaginacionDesde,
				sPaginacionNumElementos, sTipoOrden, sCodEstado, sDivisa, sTipoFecha, sFechaDesde, sFechaHasta, sImporteDeste,
				sImporteHasta, sUsuarioOrdenante, errorInfo);
				
		// Obtención del infoFileResponse
		infoFileFirResponse = servicioFirmas.getComponentesPendientesReferencia(infoFileRequest);
		
		// Manejo del infoFileResponse para mostrar la información
		if(infoFileFirResponse.getCodError() == null){
			listaFicheros = null;
			respuesta.setSuccess(RespuestaJSON.SUCCESS_KO);
		}else{
			listaFicheros = listaFicheros(infoFileFirResponse);
			totalPendienteFirma = infoFileFirResponse.getTotalComponentes();
			respuesta.setSuccess(RespuestaJSON.SUCCESS_OK);
		}
		
		// Obtención del total de ficheros en confeccion
		totalEnConfeccion = totalFicherosEnConfeccion(sCanal, sBancoInt, sReferencia, sCodOrigen, sTipoFirma);
		// Obtención del total de ficheros en histórico
		totalHistorico = totalFicherosHistorico(sCanal, sBancoInt, sReferencia, sCodOrigen, sTipoFirma);
		
		// Establecimiento de las variables en el objeto data
		data.setListaFicheros(listaFicheros);
		data.setTotalEnConfeccion(totalEnConfeccion);
		data.setTotalPendienteFirma(totalPendienteFirma);
		data.setTotalHistorico(totalHistorico);
		
		// Establecimiento de los valores en la respuesta
		respuesta.setData(data);
		respuesta.setErrorInfo(errorInfo);
		
		return respuesta;
	}
	/**
	 * Lista los ficheros pendientes de firma
	 * @param sCanal
	 * @param sBancoInt
	 * @param sReferencia
	 * @param sCodOrigen
	 * @param sTipoFirma
	 * @param sPaginacionDesde
	 * @param sPaginacionNumElementos
	 * @param sTipoOrden
	 * @param sCodEstado
	 * @param sDivisa
	 * @param sTipoFecha
	 * @param sFechaDesde
	 * @param sFechaHasta
	 * @param sImporteDeste
	 * @param sImporteHasta
	 * @param sUsuarioOrdenante
	 * @return
	 */
	@RequestMapping(value="/listarFicherosPendienteFirmaUsuario", method= { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody RespuestaJSON listarFicherosPendienteFirmaUsuario(
			@RequestParam("sCanal") String sCanal,
			@RequestParam("sBancoInt") String sBancoInt,
			@RequestParam("sReferencia") String sReferencia,
			@RequestParam("sCodOrigen") String sCodOrigen,
			@RequestParam("sCodUsuario") String sCodUsuario,
			@RequestParam("sNIFUsuario") String sNIFUsuario,
			@RequestParam("sCodBancoProd") String sCodBancoProd,
			@RequestParam("sCodProducto") String sCodProducto,
			@RequestParam("sCodSubproducto") String sCodSubproducto,
			@RequestParam("sTipoFirma") String sTipoFirma){
		
		// Variables a incluir en la respuesta
		RespuestaJSON respuesta = new RespuestaJSON();
		ErrorInfo errorInfo = new ErrorInfo();
		ListaFicheros data = new ListaFicheros();
		InfoFileResponse infoFileResponse = new InfoFileResponse();
		List<FirmaResponseJSON> listaFicheros = new ArrayList<FirmaResponseJSON>();
		int totalEnConfeccion = 0;
		int totalPendienteFirma = 0;
		int totalHistorico = 0;
		
		// Construcción de la request
		InfoFileDetailedRequest infoFileDetailedRequest = utilidades.obtenerInfoFileDetailedRequest(sCanal, sBancoInt, sReferencia, 
				sCodOrigen, sCodUsuario, sNIFUsuario, sCodBancoProd, sCodProducto, sCodSubproducto, sTipoFirma, errorInfo);
				
		// Obtención del infoFileResponse
		infoFileResponse = servicioFirmas.getComponentesPendientesReferenciaUsuario(infoFileDetailedRequest);
		
		// Manejo del infoFileResponse para mostrar la información
		if(infoFileResponse.getCodError() == null){
			listaFicheros = null;
			respuesta.setSuccess(RespuestaJSON.SUCCESS_KO);
		}else{
			listaFicheros = listaFicheros(infoFileResponse);
			totalPendienteFirma = infoFileResponse.getTotalComponentes();
			respuesta.setSuccess(RespuestaJSON.SUCCESS_OK);
		}
		
		// Obtención del total de ficheros en confeccion
		totalEnConfeccion = totalFicherosEnConfeccion(sCanal, sBancoInt, sReferencia, sCodOrigen, sTipoFirma);
		// Obtención del total de ficheros en histórico
		totalHistorico = totalFicherosHistorico(sCanal, sBancoInt, sReferencia, sCodOrigen, sTipoFirma);
		
		// Establecimiento de las variables en el objeto data
		data.setListaFicheros(listaFicheros);
		data.setTotalEnConfeccion(totalEnConfeccion);
		data.setTotalPendienteFirma(totalPendienteFirma);
		data.setTotalHistorico(totalHistorico);
		
		// Establecimiento de los valores en la respuesta
		respuesta.setData(data);
		respuesta.setErrorInfo(errorInfo);
		
		return respuesta;
	}
	/**
	 * Lista los ficheros históricos
	 * @param sCanal
	 * @param sBancoInt
	 * @param sReferencia
	 * @param sPaginacionDesde
	 * @param sPaginacionNumElementos
	 * @param sCodOrigen
	 * @param sTipoFirma
	 * @param sTipoOrden
	 * @param sCodEstado
	 * @param sDivisa
	 * @param sTipoFecha
	 * @param sFechaDesde
	 * @param sFechaHasta
	 * @param sImporteDeste
	 * @param sImporteHasta
	 * @param sUsuarioOrdenante
	 * @return
	 */
	@RequestMapping(value="/listarFicherosHistorico", method= { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody RespuestaJSON listarFicherosHistorico(
			@RequestParam("sCanal") String sCanal,
			@RequestParam("sBancoInt") String sBancoInt,
			@RequestParam("sReferencia") String sReferencia,
			@RequestParam("sCodOrigen") String sCodOrigen,
			@RequestParam("sTipoFirma") String sTipoFirma,
			@RequestParam("sPaginacionDesde") int sPaginacionDesde,
			@RequestParam("sPaginacionNumElementos") int sPaginacionNumElementos,
			@RequestParam(value="sTipoOrden", required = false, defaultValue = "") String sTipoOrden,
			@RequestParam(value="sCodEstado", required = false, defaultValue = "") String sCodEstado,
			@RequestParam(value="sDivisa", required = false, defaultValue = "") String sDivisa,
			@RequestParam(value="sTipoFecha", required = false, defaultValue = "") String sTipoFecha,
			@RequestParam(value="sFechaDesde", required = false, defaultValue = "") String sFechaDesde,
			@RequestParam(value="sFechaHasta", required = false, defaultValue = "") String sFechaHasta,
			@RequestParam(value="sImporteDeste", required = false, defaultValue = "") String sImporteDeste,
			@RequestParam(value="sImporteHasta", required = false, defaultValue = "") String sImporteHasta,
			@RequestParam(value="sUsuarioOrdenante", required = false, defaultValue = "") String sUsuarioOrdenante){
		
		// Definición e inicialización de las variables
		RespuestaJSON respuesta = new RespuestaJSON();
		ErrorInfo errorInfo = new ErrorInfo();
		ListaFicheros data = new ListaFicheros();
		InfoFileResponse infoFileResponse = new InfoFileResponse();
		List<FirmaResponseJSON> listaFicheros = new ArrayList<FirmaResponseJSON>();
		int totalEnConfeccion = 0;
		int totalPendienteFirma = 0;
		int totalHistorico = 0;
		
		//TODO: Para que se construye la request si solo usamos la response?
		
		// Construcción de la request
		InfoFileRequest infoFileRequest = utilidades.obtenerInfoFileRequest(sCanal, sBancoInt, sReferencia, sCodOrigen, sTipoFirma, sPaginacionDesde,
				sPaginacionNumElementos, sTipoOrden, sCodEstado, sDivisa, sTipoFecha, sFechaDesde, sFechaHasta, sImporteDeste,
				sImporteHasta, sUsuarioOrdenante, errorInfo);
		
		// Obtención del infoFileResponse
		// TODO: //servicio.getComponentesHistoricoReferencia(infoFileRequest);
		infoFileResponse = new InfoFileResponse();
		
		// Manejo del infoFileResponse para mostrar la información
		if(infoFileResponse.getCodError() == null){
			listaFicheros = listaFicheros(infoFileResponse);
			// Obtención del total de ficheros en confeccion
			totalHistorico = infoFileResponse.getTotalComponentes();
			respuesta.setSuccess(RespuestaJSON.SUCCESS_OK);
		}else{
			listaFicheros = null;
			respuesta.setSuccess(RespuestaJSON.SUCCESS_KO);
		}
		
		// Obtención del total de ficheros en confeccion
		totalEnConfeccion = totalFicherosEnConfeccion(sCanal, sBancoInt, sReferencia, sCodOrigen, sTipoFirma);
		// Obtención del total de ficheros pendientes de firma
		totalPendienteFirma = totalFicherosPendiente(sCanal, sBancoInt, sReferencia, sCodOrigen, sTipoFirma);
		
		// Establecimiento de las variables en el objeto data
		data.setListaFicheros(listaFicheros);
		data.setTotalEnConfeccion(totalEnConfeccion);
		data.setTotalPendienteFirma(totalPendienteFirma);
		data.setTotalHistorico(totalHistorico);
		
		// Establecimiento de los valores en la respuesta
		respuesta.setData(data);
		respuesta.setErrorInfo(errorInfo);
		
		return respuesta;
	}
	/**
	 * Sumas los importes por divisas
	 * @param listaFirmar
	 * @return
	 */
	@RequestMapping(value="/sumarImportesFicheros", method= { RequestMethod.GET, RequestMethod.POST })
	public @ResponseBody RespuestaJSON sumarImportesFicheros(@RequestParam("listaFirmar") String[][] listaImportes){
		// Definición e inicialización de las variables
		RespuestaJSON respuesta = new RespuestaJSON();
		ErrorInfo errorInfo = new ErrorInfo();
		ArrayList<String[]> data = new ArrayList<String[]>();
		
		data = totalizarImportesDivisas(listaImportes, errorInfo);
		
		// Establecimiento de los valores en la respuesta
		
		respuesta.setSuccess(RespuestaJSON.SUCCESS_OK);
		respuesta.setErrorInfo(errorInfo);
		respuesta.setData(data);
		
		return respuesta;
	}
	// Métodos privados 
	
	/**
	 * Devuelve la lista de ficheros formateados.
	 * @param infoFileResponse
	 * @return
	 */
	private ArrayList<FirmaResponseJSON> listaFicheros(InfoFileResponse infoFileResponse){
		List<FirmaResponseJSON> lista = new ArrayList<FirmaResponseJSON>();
		for(InfoFile file: infoFileResponse.getInfoFiles()){
			// Datos visibles
			FirmaResponseJSON firma = new FirmaResponseJSON();
			firma.setTipoDeOrden(file.getsCodTipoOrden());
			firma.setNombreFichero(file.getsNombreFichero());
			firma.setNumCuentaOrdenante("ALIAS");
			// Tratamiento de la fecha
			DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy", ArqSpringContext.getLocaleUsuario());
			firma.setFechaCreacion(formatter.format(file.getdFechaCreacion()));
			firma.setFechaProceso(formatter.format(file.getdFechaProceso()));
			firma.setNumOrden(String.valueOf(file.getiNumeroOrdenes()));
			firma.setImporte(String.valueOf(file.getlImporte()));
			firma.setEstado(file.getsCodEstadoFichero());
			// Datos ocultos
			firma.setAsunto(file.getsAsunto());
			firma.setIdentificadorFichero(file.getsIdOrdenFirmas());
			firma.setDivisa(file.getsDivisa());
			lista.add(firma);
		}
		return (ArrayList<FirmaResponseJSON>) lista;
	}
	/**
	 * Devuelve la lista de ficheros formateados.
	 * @param infoFileFirResponse
	 * @return
	 */
	private ArrayList<FirmaResponseJSON> listaFicheros(InfoFileFirResponse infoFileFirResponse){
		List<FirmaResponseJSON> lista = new ArrayList<FirmaResponseJSON>();
		for(InfoFileFir file: infoFileFirResponse.getInfoFilesFir()){
			// Datos visibles
			FirmaResponseJSON firma = new FirmaResponseJSON();
			firma.setTipoDeOrden(file.getsCodTipoOrden());
			firma.setNombreFichero(file.getsNombreFichero());
			firma.setNumCuentaOrdenante("ALIAS");
			// Tratamiento de la fecha
			DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy", ArqSpringContext.getLocaleUsuario());
			firma.setFechaCreacion(formatter.format(file.getdFechaCreacion()));
			firma.setFechaProceso(formatter.format(file.getdFechaProceso()));
			firma.setNumOrden(String.valueOf(file.getiNumeroOrdenes()));
			// Tratamiento del importe
			NumberFormat numberFormatter = NumberFormat.getNumberInstance(ArqSpringContext.getLocaleUsuario());
			firma.setImporte(numberFormatter.format(file.getlImporte()));
			firma.setEstado(file.getsCodEstadoFichero());
			// Datos ocultos
			firma.setAsunto(file.getsAsunto());
			firma.setIdentificadorFichero(file.getsIdOrdenFirmas());
			firma.setPesoActual(String.valueOf(file.getlPesoActual()));
			firma.setPesoFichero(String.valueOf(file.getlPesoFichero()));
			firma.setNumeroAleatorio(file.getsNumeroAleatorio());
			firma.setDivisa(file.getsDivisa());
			lista.add(firma);
		}
		return (ArrayList<FirmaResponseJSON>) lista;
	}
	/**
	 * Devuelve el total de ficheros en confección
	 * @param sCanal
	 * @param sBancoInt
	 * @param sReferencia
	 * @param sCodOrigen
	 * @param sTipoFirma
	 * @return
	 */
	private int totalFicherosEnConfeccion(String sCanal, String sBancoInt, String sReferencia, String sCodOrigen, String sTipoFirma){
		InfoFileRequest infoFileRequest = new InfoFileRequest();
		infoFileRequest.setsCanal(sCanal);
		infoFileRequest.setsBancoInt(sBancoInt);
		infoFileRequest.setsReferencia(sReferencia);
		infoFileRequest.setsCodOrigen(sCodOrigen);
		infoFileRequest.setsTipoFirma(sTipoFirma);
		infoFileRequest.setsPaginacionDesde(0);
		infoFileRequest.setsPaginacionNumElementos(0);
		InfoFileResponse infoFileResponse = servicioFicheroConfeccion.getComponentesConfeccionReferencia(infoFileRequest);
		return infoFileResponse.getTotalComponentes();
	}
	/**
	 * Devuelve el total de ficheros en el histórico
	 * @param sCanal
	 * @param sBancoInt
	 * @param sReferencia
	 * @param sCodOrigen
	 * @param sTipoFirma
	 * @return
	 */
	private int totalFicherosHistorico(String sCanal, String sBancoInt, String sReferencia, String sCodOrigen, String sTipoFirma){
		InfoFileRequest infoFileRequest = new InfoFileRequest();
		infoFileRequest.setsCanal(sCanal);
		infoFileRequest.setsBancoInt(sBancoInt);
		infoFileRequest.setsReferencia(sReferencia);
		infoFileRequest.setsCodOrigen(sCodOrigen);
		infoFileRequest.setsTipoFirma(sTipoFirma);
		infoFileRequest.setsPaginacionDesde(0);
		infoFileRequest.setsPaginacionNumElementos(0);
		// TODO:
		//InfoFileResponse infoFileResponse = servicio.getComponentesHistoricoReferencia(infoFileRequest);
		//return infoFileResponse.getTotalComponentes();
		return 0;
	}
	/**
	 * Devuelve el total de ficheros pendientes de firma
	 * @param sCanal
	 * @param sBancoInt
	 * @param sReferencia
	 * @param sCodOrigen
	 * @param sTipoFirma
	 * @return
	 */
	private int totalFicherosPendiente(String sCanal, String sBancoInt, String sReferencia, String sCodOrigen, String sTipoFirma){
		InfoFileRequest infoFileRequest = new InfoFileRequest();
		infoFileRequest.setsCanal(sCanal);
		infoFileRequest.setsBancoInt(sBancoInt);
		infoFileRequest.setsReferencia(sReferencia);
		infoFileRequest.setsCodOrigen(sCodOrigen);
		infoFileRequest.setsTipoFirma(sTipoFirma);
		infoFileRequest.setsPaginacionDesde(0);
		infoFileRequest.setsPaginacionNumElementos(0);
		InfoFileFirResponse infoFileFirResponse = servicioFirmas.getComponentesPendientesReferencia(infoFileRequest);
		return infoFileFirResponse.getTotalComponentes();
	}
	/**
	 * Obtiene un InfoFileAuditResponse a partir de los datos entregados
	 * @param infoFileAuditRequest
	 * @param iOrigenAuditoria
	 * @param errorInfo
	 * @return
	 */
	private InfoFileAuditResponse obtenerInfoFileAuditResponse(InfoFileAuditRequest infoFileAuditRequest, int iOrigenAuditoria, ErrorInfo errorInfo){
		InfoFileAuditResponse devolucion = new InfoFileAuditResponse();
		StringBuffer errorBuffer = new StringBuffer();
		boolean existenErrores = false;
		
		switch (iOrigenAuditoria) {
			case 0:
				devolucion = servicioFicheroConfeccion.getAuditoriaComponenteConfeccion(infoFileAuditRequest);
				break;
			case 1:
				devolucion = servicioFirmas.getAuditoriaComponentePendiente(infoFileAuditRequest);
				break;
			case 2:
				devolucion = servicioHistorico.getAuditoriaComponenteHistorico(infoFileAuditRequest);
				break;
			default:
				existenErrores = true;
				errorBuffer.append("Verificar la opción de auditoria requerida. ");
				break;
		}
		
		if(existenErrores){
			errorInfo.getErrorDescription().concat(errorBuffer.toString());
			devolucion = null;
		}
		
		return devolucion;
	}
	/**
	 * Totaliza los importes por divisa.
	 * @param importesFicheros
	 * @param errorInfo
	 * @return
	 */
	private ArrayList<String[]> totalizarImportesDivisas(String[][] listaImportes, ErrorInfo errorInfo){
		ArrayList<String[]> devolucion = new ArrayList<String[]>();
		
		StringBuffer errorBuffer = new StringBuffer();
		boolean existenErrores = false;
		// Obtención de divisas
		ArrayList<String> divisas = new ArrayList<String>();
		for(String[] file: listaImportes){
			divisas.add(file[1]);
		}
		HashSet<String> hs = new HashSet<String>();
		hs.addAll(divisas);
		divisas.clear();
		divisas.addAll(hs);
		// Obtención de importes
		Double suma = new Double(0);
		NumberFormat numberFormatter = NumberFormat.getNumberInstance(ArqSpringContext.getLocaleUsuario());
		ArrayList<String[]> totales = new ArrayList<String[]>();
		for(String divisa: divisas){
			for(String[] file: listaImportes){
				if(file[1].equals(divisa)){
					try {
						Double nuevo = (Double) numberFormatter.parse(file[0]);
						suma = suma + nuevo;
					} catch (ParseException e) {
						errorBuffer.append("El importe " + file[0] + "no es correcto, revisar el formato");
					}
				}
			}
			String[] total = {numberFormatter.format(suma),divisa};
			totales.add(total);
		}
		
		if(existenErrores){
			errorInfo.setErrorDescription(errorBuffer.toString());
			return devolucion;
		}else{
			devolucion = totales;
		}
		
		return devolucion;
	}
}